0035. class 类型
- 1. 🎯 本节内容
- 2. 🫧 评价
- 3. 🔍 Class 类型速览
- 4. 🤔 什么是 TypeScript 中的类(class)?
- 5. 🤔 如何声明类的属性类型?
- 6. 🤔 “类的方法类型”如何声明?
- 7. 🤔 如何获取类的自身类型?
- 8. 🔗 引用
1. 🎯 本节内容
- class 类型
2. 🫧 评价
本章主要介绍跟 Class 类相关的知识点。
3. 🔍 Class 类型速览
| 笔记 | 简介 |
|---|---|
| 0066.类属性严格初始化 | TS 默认开启的 strictPropertyInitialization 选项强制要求类属性必须在构造函数中初始化或在声明时赋值,以确保类型安全并避免未定义错误,可通过构造函数初始化、声明时赋值、非空断言、可选属性或联合 undefined 类型等方式满足检查要求。 |
| 0056.类中的参数属性 | TS 中的参数属性(Parameter Properties)是一种语法糖,允许在构造函数参数前添加访问修饰符(public/private/protected/readonly)自动创建类属性,有效减少样板代码,但不能与同名普通属性共存,且在编译时普通属性初始化会覆盖参数属性的赋值。 |
| 0057.抽象类 | 抽象类通过 abstract 关键字定义不可实例化的模板类,既能提供具体实现(属性、方法、构造函数),又能强制子类实现抽象成员,是介于普通类和接口之间的代码复用与规范约束工具。 |
| 0058.类中的存取器 | TS 的存取器(accessor)通过 getter 和 setter 语法提供对类属性的封装控制,本质上是属性而非方法,使用下划线前缀命名内部字段可避免递归错误,能实现数据验证、计算属性和只读属性等高级功能,是 JS 标准特性在 TS 中的类型安全增强。 |
| 0059.类实现接口 | TS 的 implements 关键字使类能够承诺实现一个或多个接口的契约,要求类必须完整实现所有接口定义的成员,支持同时实现 interface 和对象类型的 type,但在多接口实现中同名属性必须保持类型兼容以避免编译错误。 |
| 0060.类中的只读属性 | TS 的 readonly 修饰符提供编译时的只读约束,仅能防止属性重新赋值而无法阻止对象内部属性修改,支持与访问修饰符组合使用,可通过 Readonly、Object.freeze 或 as const 实现深度只读,且与仅含 getter 的存取器不同,其约束仅限于类型检查层面而不影响运行时行为。 |
| 0061.类的静态成员 | TS类的静态成员使用 static 关键字定义,属于类本身而非实例,通过类名直接访问,支持 public/private/protected 修饰符但不可抽象,且可以与实例成员同名,是实现工具方法、计数器和全局配置等场景的重要机制。 |
| 0062.类的三个可访问性修饰符 | TS 的 public、private 和 protected 修饰符仅提供编译时访问控制,其中 public 默认可在任意位置访问,private 仅限类内部访问,protected 允许类及其子类访问,但它们无法提供运行时保护,真正私有性需使用 ES 的#私有字段实现。 |
| 0064.类的继承 | TS 通过 extends 实现单继承,子类构造函数必须先调用 super()初始化父类部分,支持方法重写和 super 关键字调用父类成员,虽属结构类型系统但对私有成员采用名义类型规则,不支持多继承但可通过接口实现、Mixin 模式或组合替代方案实现类似功能。 |
| 0063.子类重写父类同名成员 | 成员重写是面向对象编程中实现多态的重要机制,TS 4.3 引入的 override 关键字显著提升了代码的可维护性和安全性,它能够明确表达开发者的重写意图,并在编译期捕获潜在的重构错误。 |
| 0055.类中的 this | 本文介绍 class 中 this 相关的内容,包括 this 参数(用于约束方法调用时的上下文绑定)、this 类型(随继承自动收窄为最具体子类的自引用类型)、this is Type(基于 this 的类型守卫机制)。 |
| 0065.类与函数的选择 | 优先使用无状态纯函数处理数据转换与逻辑复用,当需要封装内部状态、实现访问控制、支持多态行为或满足特定接口契约时才考虑使用类。 |
| 0111.类的类型 | TS 中类具有双重身份:作为类型时代表实例类型,作为值时代表构造函数,遵循结构化类型系统允许结构兼容的类实例或对象字面量互相赋值,可通过 typeof 获取构造函数类型并用于类型约束。 |
| 0114.类的静态块 | 静态块(Static Block)是 TS 4.4+ 引入的特性,允许在类中编写静态初始化代码块。 |
4. 🤔 什么是 TypeScript 中的类(class)?
类(class)是面向对象编程的基本构件,封装了属性和方法,TypeScript 给予了全面支持。
ts
class Point {
x: number
y: number
constructor(x: number, y: number) {
this.x = x
this.y = y
}
add(point: Point) {
return new Point(this.x + point.x, this.y + point.y)
}
}1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
上面示例中定义了一个 Point 类,包含属性 x 和 y,以及构造函数和 add 方法。
5. 🤔 如何声明类的属性类型?
类的属性可以在顶层声明,也可以在构造方法内部声明。对于顶层声明的属性,可以在声明时同时给出类型:
ts
class Point {
x: number
y: number
}1
2
3
4
2
3
4
如果不给出类型,TypeScript 会认为 x 和 y 的类型都是 any:
ts
class Point {
x
y
}1
2
3
4
2
3
4
如果声明时给出初值,可以不写类型,TypeScript 会自行推断属性的类型:
ts
class Point {
x = 0
y = 0
}1
2
3
4
2
3
4
上面示例中,属性 x 和 y 的类型都会被推断为 number。
6. 🤔 “类的方法类型”如何声明?
- 类的方法就是普通函数,类型声明方式与函数一致。
- 跟普通函数一样,可以使用可选参数、参数默认值、函数重载 …… 等写法。
- 函数类型声明的具体语法可以参考
函数类型的相关笔记。
7. 🤔 如何获取类的自身类型?
要获得一个类的自身类型,一个简便的方法就是使用 typeof 运算符:
ts
function createPoint(PointClass: typeof Point, x: number, y: number): Point {
return new PointClass(x, y)
}1
2
3
2
3
类的自身类型可以写成构造函数的形式:
ts
function createPoint(
PointClass: new (x: number, y: number) => Point,
x: number,
y: number
): Point {
return new PointClass(x, y)
}1
2
3
4
5
6
7
2
3
4
5
6
7